package com.octopus.core.matcher;

import com.octopus.core.Response;
import com.octopus.core.parser.ParseException;
import com.octopus.core.parser.ParseResult;
import com.octopus.core.parser.Parser;
import lombok.NonNull;

/**
 * 解析器匹配
 *
 * <p>考虑到爬虫页面的多样性，页面的解析也需要做特定的解析器。
 *
 * <p>对于多页面爬虫需要采取此种解析器以解析特定的网页内容
 *
 * @author shoulai.yang@gmail.com
 * @date 2019/07/31
 */
public final class ParserMatcher implements Parser, Matcher<String> {

  /** 实际匹配器，匹配网页目标链接 */
  private Matcher<String> matcher;

  /** 目标网页解析器 */
  private Parser parser;

  /**
   * 解析器匹配构造器
   *
   * @param matcher 实际匹配器
   * @param parser 目标网页解析器
   */
  public ParserMatcher(Matcher<String> matcher, Parser parser) {
    this.matcher = matcher;
    this.parser = parser;
  }

  @Override
  public final boolean matches(String obj) {
    return this.matcher.matches(obj);
  }

  @Override
  public final ParseResult parse(Response response) throws ParseException {
    return this.parser.parse(response);
  }

  /**
   * 解析器匹配构造器
   *
   * @param matcher 实际匹配器
   * @param parser 目标网页解析器
   * @return ParserMatcher实例
   */
  public static ParserMatcher of(@NonNull Matcher<String> matcher, @NonNull Parser parser) {
    return new ParserMatcher(matcher, parser);
  }
}
